spinlock: Modify recursive spinlock definitions to support up to 4095 CPUs.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 20 Oct 2008 16:16:45 +0000 (17:16 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 20 Oct 2008 16:16:45 +0000 (17:16 +0100)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/common/spinlock.c
xen/include/xen/spinlock.h

index 9e9369a4328144f693dfa7e0741a4190dead4f09..15420ebfe735e55facaba9ff2fb9f80a967eb607 100644 (file)
@@ -57,11 +57,18 @@ void _spin_barrier(spinlock_t *lock)
 void _spin_lock_recursive(spinlock_t *lock)
 {
     int cpu = smp_processor_id();
+
+    /* Don't allow overflow of recurse_cpu field. */
+    BUILD_BUG_ON(NR_CPUS > 0xfffu);
+
     if ( likely(lock->recurse_cpu != cpu) )
     {
         spin_lock(lock);
         lock->recurse_cpu = cpu;
     }
+
+    /* We support only fairly shallow recursion, else the counter overflows. */
+    ASSERT(lock->recurse_cnt < 0xfu);
     lock->recurse_cnt++;
 }
 
@@ -69,7 +76,7 @@ void _spin_unlock_recursive(spinlock_t *lock)
 {
     if ( likely(--lock->recurse_cnt == 0) )
     {
-        lock->recurse_cpu = -1;
+        lock->recurse_cpu = 0xfffu;
         spin_unlock(lock);
     }
 }
index 30ce057667233ebf2c68e898b4a80db18338949f..289018fea0defd20966f48eca1f3cd15fa3dfc27 100644 (file)
@@ -7,11 +7,11 @@
 
 typedef struct {
     raw_spinlock_t raw;
-    s8 recurse_cpu;
-    u8 recurse_cnt;
+    u16 recurse_cpu:12;
+    u16 recurse_cnt:4;
 } spinlock_t;
 
-#define SPIN_LOCK_UNLOCKED { _RAW_SPIN_LOCK_UNLOCKED, -1, 0 }
+#define SPIN_LOCK_UNLOCKED { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0 }
 #define DEFINE_SPINLOCK(l) spinlock_t l = SPIN_LOCK_UNLOCKED
 #define spin_lock_init(l) (*(l) = (spinlock_t)SPIN_LOCK_UNLOCKED)